<?php

namespace app\manage\controller;

use think\Request;
use app\common\model\Rule;
use app\common\model\UserGroup as GroupM;
use app\common\validate\UserGroup as GroupV;

/**
 * 基于公司或者部门的高级权限管理，较为复杂
 * Class Group
 * @package app\manage\controller
 */
class Group extends Base
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        // 获取当前用户管理的用户组，不包含自己所属的用户组
        // 管理员不进行子用户的添加，只需修改即可
        $map = [];
        $map[] = ['pid', '>=', $this->baseInfo['group']];
        $list = GroupM::where($map)->select();
        // 查询后，再判断path中是否包含gid
        // 递归处理数据为children，递归的时候可以实现自动去掉无关子级

        $data = [
            'items' => $list ?: [],
            'total' => $list->count()
        ];
        return $this->result_json(null, 1, $data);
    }


    /**
     * 获取有效的权限列表
     * @return \think\response\Json
     */
    public function create()
    {
        $map = [];
        if ($this->baseInfo['group'] !== 0) {
            $auths = GroupM::where('id', $this->baseInfo['group'])->value('auth');
            $map[] = ['id', 'in', $auths];
        }
        $map[] = ['status', '=', 1];
        $field = ['id', 'name', 'pid'];
        $list   = Rule::where('status', 1)->field($field)->select();
        $count  = count($list);
        // 递归处理数据为children
        $list = $list ? self::ListTree($list->toArray()): [];
        $data = [
            'items' => $list,
            'total' => $count
        ];
        return $this->result_json(null, 1, $data);
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        // 数据获取和检查
        $validate = new GroupV();
        $data = $request->only(['name','description', 'auth', 'status']);
        $data['pid'] = $pid = $this->baseInfo['group'];
        if ($pid === 0) {
            $data['path'] = "";
        } else {
            $pathP =  GroupM::where('id', $data['pid'])->value('name');
            $data['path'] = $pathP ? $pathP . ",{$pid}" : $pid;
        }


        if (!$validate->scene('New')->check($data)) {
            return $this->result_json($validate->getError(), 201);
        }

        $instance = new GroupM();
        if ($instance->save($data) === false) {
            return $this->result_json('db error', 101);
        } else {
            return $this->result_json('create success', 0, ['id' => $instance->id]);
        }
    }

    /**
     * 显示指定的资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)
    {

    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        // 字段验证和合法性验证
        // 需要判断当前的用户是否具有操作该id的权限， path记录节点路径
        // 是否能够读取
        $validate = new GroupV();
        $map = [];
        $data = $request->only(['name','description', 'auth', 'status']);

        if (!$validate->scene('Update')->check($data)) {
            return $this->result_json($validate->getError(), 201);
        }

        // 数据库同步
        $instance = GroupM::where($map)->find($id);    // 是否只查询单个字段
        if ($instance) {
            if (!$this->validatePath($instance->path)) {
                return $this->result_json('无效的操作', 202);
            }

            if ($instance->save($data) === false) {
                return $this->result_json('db error', 101);
            }
            return $this->result_json('update success', 0);
        } else {
            return $this->result_json('无效的操作', 202);
        }
    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id, $flag = true)
    {
        // 当前管理员是否具有操作权限
        $instance = GroupM::field(['status', 'path'])->find($id);
        if (!$instance) return $this->result_json('param error', 201);  // 不存在（不能操作）的用户
        if (!$this->validatePath($instance->path)) {
            return $this->result_json('param error', 201);  // 不能操作的用户
        }

        $instance->status = $flag === 'true' ? -1 : 1;
        if ($instance->save() === false) {
            return $this->result_json('db error', 101);
        }
        return $this->result_json('delete success', 0);
    }

    /**
     * 根据子节点的路径
     * @param $path
     * @param int $pid
     */
    private function buildPath($path, $pid = 0) {
        // 目前添加只能直接添加子组
        // 修改也不能修改层级关系
    }


    /**
     * 验证当前操作的组是否为管理员所在组的子组
     * @param $path
     * @return bool
     */
    private function validatePath($path) {
        if (!$path) {
            return true;
        } else {
            $paths = explode(',', $path);
            if (in_array($this->baseInfo['group'], $paths)) {
                return true;
            }
            return false;
        }
    }
}
